package org.jeecg.modules.device.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhouwr.common.device.vo.*;
import com.zhouwr.common.enums.FunctionParamInputMode;
import io.netty.channel.ChannelHandlerContext;
import org.jeecg.modules.device.entity.DeviceData;
import org.jeecg.modules.device.entity.DeviceFunctionParam;
import org.jeecg.modules.device.entity.DeviceInstance;
import org.jeecg.modules.device.entity.DeviceInstanceParam;
import org.jeecg.modules.device.enums.DeviceInstanceState;
import org.jeecg.modules.device.vo.InstanceParamStructure;
import org.jeecg.modules.scene.entity.Scene;

import java.util.Date;
import java.util.List;

/**
 * @Description: 设备实例
 * @Author: jeecg-boot
 * @Date: 2020-04-11
 * @Version: V1.0
 */
public interface IDeviceInstanceService extends IService<DeviceInstance> {

    List<DeviceInstance> listInstanceDeviceByModelType(String modelType);

    /**
     * 动态创建数据表，根据实例id
     *
     * @param instanceId
     * @return
     */
    Boolean createTable(String instanceId);

    /**
     * 根据TCP地址(IPL:PORT)获取设备实例
     *
     * @param address <p>IP:PORT</p>
     * @return 设备实例
     */
    DeviceInstance getInstanceDeviceByAddress(String address);

    /**
     * 根据设备模型id，获取设备数据节点
     *
     * @param modelId
     * @return
     */
    List<DeviceData> getDeviceDatasByModelId(String modelId);

    /**
     * 根据设备实例id，获取设备数据节点
     *
     * @param instanceId
     * @return
     */
    List<DeviceData> getDeviceDatasByInstanceId(String instanceId);

    /**
     * 根据设备实例id，获取网络连接通道
     * @param instanceId
     * @return
     * @throws Exception
     */
    ChannelHandlerContext getNetworkChannel(String instanceId) throws Exception;

    /**
     * 获取设备实例的父级网关设备实例
     *
     * @param instanceId
     * @return
     */
    DeviceInstance getParentGateway(String instanceId);

    /**
     * 获取父级实例
     *
     * @param instanceId
     * @return
     */
    DeviceInstance getParentInstance(String instanceId);

    /**
     * 获取设备的网络状态
     *
     * @param instanceId
     * @return DeviceInstanceState
     */
    DeviceInstanceState getNetworkState(String instanceId);


    /**
     * 设置实例设备的功能执行配置信息
     *
     * @param execStructure
     */
    void setFuncExecConf(InstanceFunctionExecStructure execStructure);

    /**
     * 删除执行任务
     *
     * @param execStructure
     */
    void deleteExecJob(InstanceFunctionExecStructure execStructure);

    /**
     * 添加执行任务
     *
     * @param execStructure
     * @throws Exception
     */
    void addExecJob(InstanceFunctionExecStructure execStructure) throws Exception;

    /**
     * 获取子实例列表，根据实例id
     *
     * @param id
     * @param withSelf
     * @return
     */
    List<DeviceInstance> getInstanceChildren(String id, Boolean withSelf);

    /**
     * 模型扩展参数，带数值
     * @param instanceId
     * @param modelId
     * @return
     * @throws Exception
     */
    List<InstanceExtentParams> getModelExtendParams(String instanceId, String modelId) throws Exception;

    /**
     * 模型扩展参数，不带数值
     * @param modelId
     * @param inputMode
     * @return
     * @throws Exception
     */
    List<InstanceExtentParams> getModelExtendParams(String modelId, FunctionParamInputMode inputMode) throws Exception;

    /**
     * 实例扩展参数，带数值
     * @param instanceId
     * @return
     * @throws Exception
     */
    List<InstanceExtentParams> getInstanceExtendParams(String instanceId) throws Exception;

    /**
     * 建立功能输入参数，不带数值
     *
     * @param functionInputParams  功能输入参数
     * @return DeviceFunctionInputParam
     */
    List<InstanceFunctionInputParam> buildFunctionInputParams(List<DeviceFunctionParam> functionInputParams) throws Exception;

    /**
     * 功能输入参数，不带数值
     *
     * @param functionInputParams
     * @param inputMode
     * @return
     * @throws Exception
     */
    List<InstanceFunctionInputParam> buildFunctionInputParams(List<DeviceFunctionParam> functionInputParams, FunctionParamInputMode inputMode);

    /**
     * 建立功能输入参数，带数值
     *
     * @param functionInputParams  功能输入参数
     * @param instanceExtendParams 实例扩展参数，对应功能输入参数
     * @return DeviceFunctionInputParam
     */
    List<InstanceFunctionInputParam> buildFunctionInputParams(List<DeviceFunctionParam> functionInputParams, List<DeviceInstanceParam> instanceExtendParams) throws Exception;

    /**
     * 构建功能结构
     *
     * @param instance 设备实例
     * @return 设备实例扩展参数（功能及输入参数）
     */
    List<InstanceFunctionStructure> buildFunctionStructures(DeviceInstance instance) throws Exception;

    /**
     * 构建实例的历史数据
     *
     * @param instanceId 实例id
     * @return List<InstanceDataStructure>
     */
    List<InstanceDataStructure> buildInstanceDataHistory(String instanceId);

    /**
     * 构建实例的历史数据
     * @param instanceId 实例id
     * @param begin 开始时间
     * @param end   结束时间
     * @return
     */
    List<InstanceDataStructure> buildInstanceDataHistory(String instanceId, Date begin, Date end);

    /**
     * 构建数据节点，数据值取最新一条数据值
     *
     * @param instanceId 实例id
     * @return List<InstanceDataStructure>
     */
    List<InstanceDataStructure> buildInstanceDataCurrent(String instanceId);

    /**
     * 构建功能执行结构
     * @param instance
     * @return
     */
    List<InstanceFunctionExecStructure> buildFunctionExecStructure(DeviceInstance instance);

    /**
     * 批量更新实例状态
     * @param instanceId
     * @param status
     */
    void batchUpdateInstanceState(String instanceId, DeviceInstanceState status);

    /**
     * 更新实例及参数
     * @param structure
     */
    void updateInstanceParams(InstanceParamStructure structure);

    /**
     * 手动下线设备
     * @param instanceId
     */
    void manuallyOffline(String instanceId);

    /**
     * 根据实例id，获取实例所属场景
     * @param instanceId
     * @return
     */
    Scene getScene(String instanceId);

    /**
     * 根据实例id，获取实例所属场景id
     *
     * @param instanceId
     * @return
     */
    String getSceneId(String instanceId);

    /**
     * 按ID查询相同级别
     *
     * @param instanceId
     * @return
     */
    List<DeviceInstance> querySameLevelById(String instanceId);


}
